home *** CD-ROM | disk | FTP | other *** search
/ Info-Mac 4 / Info_Mac IV CD-ROM (Pacific HiTech Inc.)(August 1994).iso / Development / Source / GENetReleaseƒ / GEDemo / Grabber.c < prev    next >
Text File  |  1994-03-07  |  4KB  |  180 lines

  1. /*
  2.     Grabber.c
  3.     
  4.     Special Graphic Element to manipulate other Graphic Elements
  5.     
  6.     Copyright 1993 by Al Evans. All rights reserved.
  7.     
  8.     11/29/93
  9.     
  10.     NOTICE:
  11.     
  12.     Because it acts as a "meta-element", this grabber utilizes knowledge of the
  13.     low-level implementation details of graphic elements and sensors. 
  14.     
  15. */
  16.  
  17. #include "Grabber.h"
  18.  
  19. pascal void RenderGrabber(GrafElPtr graphic, GWorldPtr destGWorld)
  20. {
  21. #pragma unused (destGWorld)
  22.     if (graphic->slaveGrafEl)
  23.         FrameRect(&graphic->animationRect);
  24. }
  25.  
  26. void DropSelection(GEWorldPtr world, GrabberPtr grabber)
  27. {
  28.     GrafElPtr element = (GrafElPtr) grabber;
  29.     
  30.     if (element->slaveGrafEl) {
  31.         ChangedRect(world, &element->slaveGrafEl->animationRect);
  32.         element->slaveGrafEl->changeIntrvl = grabber->slaveChgIntrvl;
  33.         element->slaveGrafEl = nil;
  34.         RectZero(&element->animationRect);
  35.     }
  36. }
  37.  
  38. Boolean GetNewSelection(GEWorldPtr world, GrabberPtr grabber, Point mousePt)
  39. {
  40.     GrafElPtr    newSelection = nil;
  41.     GrafElPtr    testElement;
  42.     Rect*        testRect;
  43.     
  44.     testElement = world->drawList;
  45.     
  46.     //Find TOPMOST element which contains mousePt
  47.     while (testElement) {
  48.         testRect = &testElement->animationRect;
  49.         if ((mousePt.v > testRect->top) && (mousePt.v < testRect->bottom) &&
  50.             (mousePt.h > testRect->left) && (mousePt.h < testRect->right) &&
  51.             (testElement->drawPlane >= grabber->minPlane))
  52.             newSelection = testElement;
  53.         testElement = testElement->nextByPlane;
  54.     }
  55.     if (newSelection) {
  56.         ((GrafElPtr) grabber)->slaveGrafEl = newSelection;
  57.         grabber->slaveChgIntrvl = newSelection->changeIntrvl;
  58.         newSelection->changeIntrvl = 0;    //Stop autochanges
  59.         ((GrafElPtr) grabber)->animationRect = newSelection->animationRect;
  60.         ChangedRect(world, &newSelection->animationRect);
  61.         return true;
  62.     }
  63.     else {
  64.     
  65.         return false;
  66.     }
  67. }
  68.  
  69. void ActivateGrabber(GEWorldPtr world, Boolean activate)
  70. {
  71.     GrabberPtr    grabber;
  72.     
  73.     
  74.     grabber = (GrabberPtr) FindElementByID(world, grabberID);
  75.     if (grabber) {
  76.         if (activate) {
  77.             ((GrafElPtr) grabber)->slaveGrafEl = nil;
  78.             grabber->slaveChgIntrvl = 0;
  79.             AddSensorToList(world, grabberID, &world->animationRect);
  80.             ShowElement(world, grabberID, true);
  81.         }
  82.         else {
  83.             DropSelection(world, grabber);
  84.             RemoveSensorFromList(world, grabberID);
  85.             ShowElement(world, grabberID, false);
  86.         }
  87.     }
  88. }
  89.  
  90. pascal Boolean TrackGrabber(GEWorldPtr world, GrafElPtr sensor)
  91. /*
  92.     Is mousePoint inside selection?
  93.         No:  Deselect current selection
  94.              Make new selection
  95.              If new selection == nil return
  96.     While mouseDown
  97.         Drag selection
  98. */
  99. {
  100.     Point    localPt, newPt;
  101.     short    dx;
  102.     short    dy;
  103.     OSType    sensorID;
  104.     
  105.     
  106.     GetMouse(&localPt);
  107.     if (!PtInRect(localPt, &sensor->animationRect)) {
  108.         DropSelection(world, (GrabberPtr) sensor);
  109.         if (!GetNewSelection(world, (GrabberPtr) sensor, localPt))
  110.             return true;
  111.     }
  112.     dx = localPt.h - ((GrafElPtr) sensor)->animationRect.left;
  113.     dy = localPt.v - ((GrafElPtr) sensor)->animationRect.top;
  114.     sensorID = sensor->objectID;
  115.     while(StillDown()) {
  116.         GetMouse(&newPt);
  117.         if (*((long *) &localPt) != *((long *) &newPt)) {
  118.             MoveElementTo(world, sensor->slaveGrafEl->objectID, newPt.h - dx, newPt.v - dy);
  119.             sensor->animationRect = sensor->slaveGrafEl->animationRect;
  120.             localPt = newPt;
  121.         }
  122.         DoWorldUpdate(world, false);
  123.     }
  124.     return true;
  125. }
  126.  
  127. GrafElPtr MakeGrabber(GEWorldPtr world)
  128. {
  129.     GrafElPtr    grabber;
  130.     
  131.     grabber = NewGrafElement(world, grabberID, grabberPlane, sizeof(Grabber), NoLoader, 0, 0);
  132.     if (grabber) {
  133.         grabber->copyMode = srcCopy;
  134.         grabber->flags = 0;
  135.         grabber->renderIt = RenderGrabber;
  136.         grabber->drawIt = nil;
  137.         grabber->changeIntrvl = 0;
  138.         grabber->trackingProc = TrackGrabber;
  139.         grabber->actionProc = nil;
  140.         ((GrabberPtr) grabber)->slaveChgIntrvl = 0;
  141.         ((GrabberPtr) grabber)->minPlane = 2;
  142.         ((GrabberPtr) grabber)->maxPlane = 32000;
  143.         
  144.         
  145.     }
  146.     return grabber;
  147.     
  148. }
  149.  
  150. Boolean GrabberActive(GEWorldPtr world)
  151. {
  152.     GrafElPtr    grabber;
  153.     grabber = FindElementByID(world, grabberID);
  154.     if    (grabber)
  155.         return (grabber->flags & geShown);
  156.     else
  157.         return false;
  158. }
  159.  
  160. void SetGrabberDepth(GEWorldPtr world, short newMinPlane, short newMaxPlane)
  161. {
  162.     GrabberPtr    grabber;
  163.     grabber = (GrabberPtr) FindElementByID(world, grabberID);
  164.     if (grabber) {
  165.         grabber->minPlane = newMinPlane;
  166.         grabber->maxPlane = newMaxPlane;
  167.     }
  168. }
  169.  
  170. GrafElPtr  CurrentGrabberSelection(GEWorldPtr world)
  171. {
  172.     GrafElPtr    grabber;
  173.     
  174.     grabber = FindElementByID(world, grabberID);
  175.     if (grabber)
  176.         return grabber->slaveGrafEl;
  177.     else
  178.         return nil;
  179. }
  180.